查看原文
其他

EEG数据分析时如何对分段数据进行伪迹检测与排除?

念靖晴 流浪心球 2022-04-26

之前,我们推出了 基于Matlab、EEGLab和ERPlab的偏侧化差异波(N2pc/Pd/CDA )成分分析方法 一文,在推文中鉴于篇幅有限,我们仅仅举例说明了在进行偏侧化成分分析时,基于ERPlab对分段数据进行伪迹检测与排除的一种方法,未能详尽地对伪迹检测和排除的方法和实现过程进行介绍。


第一部分 伪迹检测的基本过程


选择伪迹检测方法。如:Step-like artifacts等。

选择伪迹检测阈值。如:±75 μv。

肉眼检测。如:基于已有的经验,肉眼识别后手动进行伪迹排除。


第二部分 常见伪迹及检测方法

2.1 眨眼
眨眼检测常用的方法有滑动窗峰-峰振幅(moving window peak-to-peak threshold) 和阶跃函数(step function)。
2.2 眼动
单试次中大的眼动相对容易被检测,而小的眼动则很难被检测到,则需使用阶跃函数(step function)进行检测。
2.3 其他慢电压漂移、肌肉伪迹等
检测常用方法与眨眼检测方法基本一致,但阈值的设定要比眨眼的高。


关于常见伪迹的介绍可进一步阅读以下书籍:

[1]Steven J. Luck(著),洪祥飞(译)(2019).事件相关电位基础(第二版),华东师范大学出版社.

[2]Luck,S.J.(2014).An introduction to the event-related potential technique(2nd). MIT press.


第三部分 伪迹检测和排除的具体实现过程

(以Hakim et al.,2020为例)


在进行偏侧化成分分析时,我们需要尽可能避免眼动(Eye Movement)、眨眼(Blinks)、漂移(Drift)、肌肉伪迹(Muscle Artifacts)、阻塞(Blocking)等伪迹对成分的干扰。


3.1 眼动(Eye Movement)

通过sliding window step function 对水平眼电(HEOG)对眼动进行检测。在每个试次中,以100 ms为时间窗每次以10 ms 进行移动,如果幅值变化超过20 μv 则被标记为眼动伪迹并排除。示例代码如下:

tic
markH = NaN(1,nTrials);heogDat = squeeze(erp.arfDat.data(:,ismember(chanLabels,'HEOG'),:));%%%%% check for horizontal eye movements parfor t = 1:nTrials rawTS = heogDat(t,:); eMoveH = step_t(rawTS,rateAcq,eMoveStep,eMoveWin,eMoveThr); % 33 = VEOG channel markH(t) = artDetect(eMoveH); end
mark = markH;erp.arf.eMove = mark;toc


3.2 眨眼(Blinks)

通过sliding window step function 对垂直眼电(VEOG)对眼动进行检测。在每个试次中,以80 ms为时间窗每次以10 ms 进行移动,如果幅值变化超过30 μv 则被标记为眼动伪迹并排除。示例代码如下:


%%%%% check for blinks ticmark = NaN(1,nTrials);veogDat = squeeze(erp.arfDat.data(:,ismember(chanLabels,'VEOG'),:));parfor t = 1:nTrials rawTS = veogDat(t,:); % Check for blinks using peak-to-peak amplitude blink = step_t(rawTS,rateAcq,blinkStep,blinkWin,blinkThr); % 33 = VEOG channel mark(t) = artDetect(blink);enderp.arf.blink = mark;tocfprintf('checking for eye movements... \n')
tic


3.3 漂移(Drift)

如果试次的前15%和后15%之间的幅值变化大于100 μv,则被标记为漂移并排除。如果是较小的漂移,则使用通过sliding window step function 进行检测。在每个试次中,以100 ms为时间窗每次以10 ms 进行移动,如果幅值变化超过100 μv 则被标记为漂移并排除。示例代码如下:
% check for extreme drift in all scalp channles checkChannel = ~ismember(chanLabels,{'HEOG','VEOG','StimTrak'}); % specify names of channels to skip if checkChannel(i) drift = drift_check(rawTS,rateAcq,driftThr); mark = artDetect(drift); mark_driftFull(i,t) = mark;end

% check for extreme channel drop out (step function) in all scalp channles checkChannel = ~ismember(chanLabels,{'HEOG','VEOG','StimTrak'}); % specify names of channels to skip if checkChannel(i) dropout = step_t(rawTS,rateAcq,dropoutStep,dropoutWin,dropoutThr); mark = artDetect(dropout); mark_dropoutFull(i,t) = mark; end


3.4 肌肉伪迹(Muscle Artifacts)

通过 moving window peak-to-peak threshold的方法进行检测,如果在15 ms的时间窗内峰值变化超过200 μv,则视为肌肉伪迹并排除。示例代码如下:
% check for noise in all scalp channels checkChannel = ~ismember(chanLabels,{'HEOG','VEOG','StimTrak'}); % specify names of channels to skip if checkChannel(i) noise = ppa(rawTS,rateAcq,noiseThr); mark = artDetect(noise); mark_noiseFull(i,t) = mark;end


3.5 阻塞(Blocking)

如果任意一个电极点在200 ms 的时间窗内有任意30个时间点的电压在 1 V 内则视为信号通道阻塞并排除。示例代码如下:
% check for blocking in all channels except StimTrak checkChannel = ~ismember(chanLabels,'StimTrak'); % specify names of channels to skip if checkChannel(i) block = blockReject(rawTS,rateAcq); mark = artDetect(block); mark_blockingFull(i,t) = mark;end


注:关于伪迹检测具体实现的更多细节,可以阅读文献:Hakim, N., Feldmann-Wüstefeld, T., Awh, E., & Vogel, E. K. (2020). Perturbing neural representations of working memory with task-irrelevant interruption. Journal of Cognitive Neuroscience32(3), 558-569.

同时,本推文中的代码均来源于Hakim et al.(2020)的数据分析代码。鉴于篇幅有限,对推文中涉及的数据分析代码未一一进行注解,如果想了解代码的更多信息,可以通过以下链接(或点击文末阅读原文):https://osf.io/g5ahn/ 下载论文中所使用的原始EEG数据和完整的数据分析代码。

扩展阅读:

EEG/ERP研究中如何获得稳定可信的结果或效应

【荐书】EEG/ERP书籍(海外篇)

脑电数据分析中如何获取相对干净的数据结果?

ERP数据分析中N2pc/Pd成分置换检验的实现

ERPLAB中计算差异波(即:对侧减同侧;N2pc\Pd\CDA)


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存